package com.blackcat.metaannotation.inherited;

import java.lang.annotation.Annotation;

/**
 * <p> 描述 : 测试
 * @author : blackcat
 * @date  : 2020/8/7 9:17
 *
 * 说明：
 *	01 Abbreviation 注解标记 @Inherited
 *	02 Name 注解标记 @Inherited
 *	03 UpperCaseName 注解 没有标记 @Inherited
 *
 *  Organism(接口 01,02,03) <- Plant(接口) <- Flower(抽象类 01,02,03) <- Rose(类)
 *  Organism(接口 01,02,03) <- Animal(接口) <- Mammal(抽象类) <- Monkey(类 01,02,03) <- Roxellanae(类 02)
 *
 * 结论：
 * 	没有被@Inherited注解标记的注解，如：@UpperCaseName注解，就不具有继承特性，在子类中获取不到父类的注解。
 *
 * 	Inherited注解继承概念跟我们理解的面向对象继承概念不一样，它只作用于子类与父类之间的继承。
 * 	如：Rose类就从Flower父类中继承了@Abbreviation和@Name注解；对于接口之间的继承和类与接口之间的实现，这两种继承关系不起作用。
 * 	如：Plant接口继承Organism接口、Mamanl类实现Animal接口，就没能继承@Abbreviation和@Name注解。
 *
 * 	Inherited注解标记的注解，在使用时，如果父类和子类都使用的注解是同一个，那么子类的注解会覆盖父类的注解。
 * 	如：Roxellanae类用@Name注解标记了，Monkey类也用@Name注解标记了，那么Roxellanae类注解，会覆盖Monkey的@Name注解。
*/
public class TestInheritedAnnotation {

	public static void main(String[] args){

		Annotation[] annotations = Plant.class.getAnnotations();
		System.out.print("Plant接口继承Organism接口，在Organism接口上标记的注解，Plant获取不到：");
		for (Annotation annotation : annotations){
			System.out.print(annotation.toString()+" ");
		}
		annotations = Mammal.class.getAnnotations();
		System.out.print("\nMamanl抽象类实现Animal接口，在Animal接口上标记的注解，Mammal获取不到：");
		for (Annotation annotation : annotations){
			System.out.print(annotation.toString()+" ");
		}
		annotations = Rose.class.getAnnotations();
		System.out.print("\nRose类继承Flower抽象类，在Flower抽象类上标记的注解，如果注解是被@Inherited标记的，都可以获取到：");
		for (Annotation annotation : annotations){
			System.out.print(annotation.toString()+" ");
		}
		annotations = Roxellanae.class.getAnnotations();
		System.out.print("\nRoxellanae类继承Monkey类，在Monkey抽象类上标记的注解，如果注解是被@Inherited标记的，都可以获取到；如果被@Inherited标记的注解父类和子类重复标记，则返回子类的注解：");
		for (Annotation annotation : annotations){
			System.out.print(annotation.toString()+" ");
		}

	}
}
